/**
 * \file
 */
#ifndef AUXILIAR_NETWORK_H
#define AUXILIAR_NETWORK_H

#include "auxNodeEdge.h"

typedef struct sAuxNet *auxNet;

/**
 * Construye un nuevo network auxiliarpor niveles a partir del network 'net'
 * usando una versión modificada del algoritmo BFS.
 * \param net Network original.
 * \param label_s Etiqueta que identifica al nodo fuente.
 * \param label_t Etiqueta que identifica al nodo sumidero.
 * \return Network auxiliar por niveles.
 */
auxNet auxNetwork_create(network net, const unsigned int label_s,
                                  const unsigned int label_t);

/**
 * Destruye un network auxiliar
 * \param aNet Network auxiliar a destruir.
 * \return NULL
 */
auxNet auxNetwork_destroy(auxNet aNet);

/**
 * Obtiene el nodo sumidero del network auxiliar.
 * \param aNet Network auxiliar que puede o no contener al nodo sumidero.
 * \return Nodo sumidero si está presente, o NULL en caso contrario.
 */
nodeANet auxNet_getSinkNode(const auxNet aNet);

/**
 * Agrega al nodo identificado por la etiqueta 'label' al network auxiliar
 * en el ultimo nivel.
 * \param aNet Network auxiliar al que se agregará el nodo.
 * \param label Etiqueta del nodo que quiere agregar.
 * \return Nodo agregado.
 */
nodeANet auxNetwork_addNode(auxNet aNet, const unsigned int label);

/**
 * Devuelve el nodo identificado por la etiqueta 'label'.
 * \param aNet Network auxiliar.
 * \param label Etiqueta del nodo buscado.
 * \return Nodo buscado o NULL si no se encontró.
 */
nodeANet auxNetwork_getNode(const auxNet aNet, const unsigned int label);

/**
 * Devuelve la arista (orig, dst) si está presente en el network auxiliar.
 * \param aNet Network auxiliar.
 * \param orig Nodo de origen.
 * \param dst Nodo de destino.
 * \return Arista (orig, dst) o NULL si no se encontró.
 */
edgeANet auxNetwork_getEdge(const auxNet aNet, const nodeANet orig,
                                          const nodeANet dst);

/**
 * Imprime las etiquetas de los nodos como conjunto.
 * \param aNet Network auxiliar a imprimir.
 * \param source Nodo de origen del flujo.
 */
void auxNetwork_printNodes(const auxNet aNet, unsigned int source);

/**
 * Usada para Debug. Imprime información acerca del network auxiliar.
 * \param aNet Network auxiliar.
 */
void auxNetwork_print(const auxNet aNet);

#endif
